/**
 * 工程名: 	Quickdisk
 * 文件名: 	FileTypeFilterService.java
 * 创建人:  	guo.tianxiang
 * 创建时间: 	2014-5-8 下午2:25:07
 * 版权所有：Guo Tianxiang
 * 文件描述: 描述该文件的作用
 * -----------------------------变更记录 ----------------------------- 
 * 日期        		变更人      		版本号  		变更描述  
 * ------------------------------------------------------------------  
 * 2014-5-8     guo.tianxiang   	1.0       	first created  
 */
package com.tianxiang.service;

import java.io.File;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.tianxiang.dao.MyFileDao;
import com.tianxiang.model.MyFile;
import com.tianxiang.model.Owner;
import com.tianxiang.utils.Tools;

/**
 * 过滤指定文件类型
 * 
 * @since Quickdisk 1.2
 * @version 1.0 2014-5-8
 * @author guo.tianxiang
 */
public class FileFilterService {
	String []doc={"doc","docx","ppt","pptx","txt","pdf"};
	String []music={"mp3","wav","wma"};
	String []video={"avi","rm","rmvb","mp4","mov"};
	String []pic={"bmp","png","jpeg","jpg","gif","tiff"};
	
	
	/**
	 * 
	* 从数据库获取用户文件
	* @param type 文件类型
	* @param path 文件目录
	* @return
	 * @throws ParseException 
	 */
	public ArrayList<MyFile> getFileFilterList(String username, String type) throws ParseException {

		ArrayList<MyFile> myFilesList = new ArrayList<MyFile>();
		ArrayList<String>extList=null;
		List<MyFile> filesList=null ;
		boolean exclude=true;
		String fileExt=null;								//文件扩展名
		
		ListFileService listFileService=new ListFileService();
		filesList=listFileService.listUserFiles(username);
		
		//获取要过滤的文件类型列表
		if (type.equals("doc")) {
			extList=getExtList(doc);
		}else if(type.equals("music")){
			extList=getExtList(music);
		}else if (type.equals("picture")) {
			extList=getExtList(pic);
		}else if (type.equals("video")) {
			extList=getExtList(video);
		}else  if(type.equals("other")){
			exclude=false;
			extList=getExtList(music);
			extList.addAll(getExtList(doc));
			extList.addAll(getExtList(pic));
			extList.addAll(getExtList(video));
		}
						
		for (int i=0;i<filesList.size();i++) {
			fileExt=filesList.get(i).getName().substring(filesList.get(i).getName().lastIndexOf(".")+1).toLowerCase();
			Owner o;
			MyFile mf;
			int fid;
			MyFileDao myFileDao=new MyFileDao();
			ArrayList<Owner> lists=myFileDao.findUserFile(username);
			//exclude为true表示包含指定类型文件，否则表示排除指定类型文件
			if (exclude?extList.contains(fileExt):!extList.contains(fileExt)) {		//该文件是所求类型的文件
				MyFile myFile = new MyFile();
				o=lists.get(i);
				fid=lists.get(i).getFileId();
				mf=myFileDao.findFileById(fid);
				if(o.getIsAlive()==0){
					myFile.setName(o.getOfileName());
					myFile.setFileType(mf.getFileType());
					myFile.setFileSize(Tools.dealFileSize(Long.parseLong(mf.getFileSize())));
					myFile.setLastModitied(o.getLastModify());
					myFile.setPath(o.getOuserPath());
					myFile.setFile(true);
					myFilesList.add(myFile);
				}
			}
		}
		return myFilesList;
	}

	
	/**
	 * 文件彻底删除，删除实体文件
	 * @param path
	 * @return
	 */
	public boolean delPermanent(String path){
		File f=new File(path);
		if(f.delete()){
			return true;
		}
		return false;
	}
	
	/**
	 * 
	* 获取指定目录下指定类型的所有文件列表，包括子文件夹
	* @param type 文件类型
	* @param path 文件目录
	* @return
	 * @throws ParseException 
	 */
	public ArrayList<MyFile> getFilterList(String path, String type) throws ParseException {

		ArrayList<MyFile> myFilesList = new ArrayList<MyFile>();
		ArrayList<String>extList=null;
		
		
		
		
		List<File> filesList=null ;
		boolean exclude=true;
		String fileExt=null;								//文件扩展名
		
		filesList= listAllChildFile(path);		//获取所有子文件
		//获取要过滤的文件类型列表
		if (type.equals("doc")) {
			extList=getExtList(doc);
		}else if(type.equals("music")){
			extList=getExtList(music);
		}else if (type.equals("picture")) {
			extList=getExtList(pic);
		}else if (type.equals("video")) {
			extList=getExtList(video);
		}else  if(type.equals("other")){
			exclude=false;
			extList=getExtList(music);
			extList.addAll(getExtList(doc));
			extList.addAll(getExtList(pic));
			extList.addAll(getExtList(video));
		}
						
		for (File file : filesList) {
			fileExt=file.getName().substring(file.getName().lastIndexOf(".")+1).toLowerCase();
			//exclude为true表示包含指定类型文件，否则表示排除指定类型文件
			if (exclude?extList.contains(fileExt):!extList.contains(fileExt)) {		//该文件是所求类型的文件
				MyFile myFile = new MyFile();
				myFile.setFile(true);
				myFile.setName(file.getName());
				myFile.setFileSize(Tools.dealFileSize(file.length()));
				myFile.setFileType(Tools.getFileType(file.getName()));
				myFile.setLastModitied(Tools.fileLastModifyTime(file
						.lastModified()));
				myFile.setPath(file.getParent().substring(path.length()));
				myFilesList.add(myFile);
			}
		}
		return myFilesList;
	}
	
	/**
	 * 
	* 获取用户回收站内的文件，包括子文件夹
	* @param type 文件类型
	* @param path 文件目录
	* @return
	 * @throws Exception 
	 */
	
	public ArrayList<MyFile> ListUserRecycal(String path,String username) throws Exception {
		List<File> filesList=null ;
		filesList= listRecycalChildFile(path);
		ArrayList<MyFile> recycalList = new ArrayList<MyFile>();
		for (File file : filesList) {
			MyFile myFile = new MyFile();
			if(!file.isFile()){
				long remain=myFile.getKeepTime()-(Tools.getCurrTime()-file.lastModified()/1000);
				String showHour=remain/3600%24==0?"":Long.toString(remain/3600%24)+"小时";
				if(remain<=0){
					File ff =new File(file.getPath());
					ff.delete();
				}else{
					myFile.setFile(false);
					myFile.setName(file.getName());
					myFile.setFileSize("-");
					myFile.setFileType(Tools.FOLDERTYPE);
					myFile.setLastModitied(Tools.fileLastModifyTime(file
							.lastModified()));
					myFile.setRemainTime(Long.toString(remain/3600/24)+"天"+showHour);
					myFile.setDelTime(file.lastModified());
					myFile.setPath(Tools.getRecycalPath(username+"\\"+file.getName()));
					recycalList.add(myFile);
			}
		}
	}
		
		MyFileDao myFileDao = new MyFileDao();
		ArrayList<Owner> lists=myFileDao.findUserFile(username);
		System.out.println("lists的大小："+lists.size());
		MyFile mf;
		Owner o ;
		MyFile myFile;
		int count=0;
		for(int i=0;i<lists.size();i++){
			o=lists.get(i);
			int fId=lists.get(i).getFileId();
			mf=myFileDao.findFileById(fId);
			int userCount=mf.getCount();
			if(o.getIsAlive()==1){
				count++;
				myFile = new MyFile();
				long remain=myFile.getKeepTime()-(Tools.getCurrTime()-o.getDelTime());
				String showHour=remain/3600%24==0?"":Long.toString(remain/3600%24)+"小时";
				if(remain<=0){  //若用户删除的文件在回收的时间超过所限时间，系统将自动删除记录；
					myFileDao.deOwner(o.getId());
					userCount-=1;
					mf.setCount(userCount);
				}
				if(userCount==0){
					System.out.println("将要删除的文件id： "+mf.getFid());
					myFileDao.delFile(mf.getFid());
					this.delPermanent(mf.getPath());//若文件无人拥有将彻底删除；
				}else{
					myFile.setName(o.getOfileName());
					myFile.setFileType(mf.getFileType());
					myFile.setFileSize(Tools.dealFileSize(Long.parseLong(mf.getFileSize())));
					myFile.setLastModitied(o.getLastModify());
					myFile.setPath(o.getOuserPath());
					myFile.setFile(true);
					myFile.setRemainTime(Long.toString(remain/3600/24)+"天"+showHour);
					recycalList.add(myFile);
				}
			}
			
		}
		System.out.println("回收站里有 "+count+" 个文件");
		return recycalList;
	}
	
	/**
	 * 
	* 获取用户回收站内的文件，包括子文件夹(老方法，不适用)
	* @param type 文件类型
	* @param path 文件目录
	* @return
	 * @throws Exception 
	 */
	
//	public ArrayList<MyFile> getUserRecycal(String path,String username) throws Exception {
//		ArrayList<MyFile> recycalList = new ArrayList<MyFile>();
//		List<File> filesList=null ;
//		filesList= listRecycalChildFile(path);
//		
//		for (File file : filesList) {
//				MyFile myFile = new MyFile();
//				if(file.isFile()){
//					myFile.setFile(true);
//					myFile.setName(file.getName());
//					myFile.setFileSize(Tools.dealFileSize(file.length()));
//					myFile.setFileType(Tools.getFileType(file.getName()));
//					myFile.setLastModitied(Tools.fileLastModifyTime(file
//							.lastModified()));
//					myFile.setDelTime(file.lastModified());
//					myFile.setPath(Tools.getRecycalPath(username+"\\"+file.getName()));
//				}else{
//					long size=Tools.folderSize(file);
//					myFile.setFile(false);
//					myFile.setName(file.getName());
//					myFile.setFileSize(Tools.dealFileSize(size));
//					myFile.setFileType(Tools.FOLDERTYPE);
//					myFile.setLastModitied(Tools.fileLastModifyTime(file
//							.lastModified()));
//					myFile.setDelTime(file.lastModified());
//					myFile.setPath(Tools.getRecycalPath(username+"\\"+file.getName()));
//				}
//				recycalList.add(myFile);
//		}
//		
//		int size=recycalList.size();
//		for(int i=size-1;i>=0;i--){
//			MyFile file=recycalList.get(i);
//			long remain=file.getKeepTime()-Tools.delPermanent(file.getDelTime());
//			String showHour=remain/3600%24==0?"":Long.toString(remain/3600%24)+"小时";
//			file.setRemainTime(Long.toString(remain/3600/24)+"天"+showHour);
//			System.out.println("剩余时间---->"+file.getRemainTime());
//			if(remain<=0){
//				File f =new File(file.getPath());
//				System.out.println("path--->"+file.getPath());
//				f.delete();
//				recycalList.remove(i);
//			}
//		}
//		
//		return recycalList;
//	}
	
	/**
	 * 
	* 根据指定的正则表达式匹配指定文件夹件,文件来源于用户目录
	* @param regKey 要查找的关键词
	* @param path 要查找的目录
	* @return
	 * @throws ParseException 
	 */
	public ArrayList<MyFile> findFolderByKey(String path,String username,String regKey) throws ParseException {
		ArrayList< MyFile>regList=new ArrayList<MyFile>();	
		File parentFolder=new File(path);		//要查询的父文件夹//保存返回的符合条件的文件列表
		Pattern pattern=Pattern.compile(regKey);
		Matcher matcher=null;
		String fileName=null;										//临时保存文件名
		File[]childrenFiles=parentFolder.listFiles();
		for (File file : childrenFiles) {
			fileName=file.getName();
			matcher=pattern.matcher(fileName);
		//	System.out.println(fileName+"\t"+matcher.find());
			if ((matcher.find()&&file.isDirectory())||regKey.equals("关键字查询")) {
				MyFile myFile=new MyFile();
				myFile.setFile(false);
				myFile.setFileSize("-");
				myFile.setFileType(Tools.FOLDERTYPE);
				myFile.setLastModitied(Tools.fileLastModifyTime(file.lastModified()));
				myFile.setName(fileName);
				System.out.println("parent:"+file.getParent());
				System.out.println("path:"+path);
				myFile.setPath(file.getParent().substring(path.length()));
				regList.add(myFile);
			}
			if (file.isDirectory()) {
				regList.addAll(findFolderByKey( file.getAbsolutePath(),username,regKey));
			}
		}
		return regList;
	}
	
	/**
	 * 
	* 根据指定的正则表达式匹配指定文件夹下的文件,文件来源于数据库
	* @param regKey 要查找的关键词
	* @param path 要查找的目录
	* @return
	 * @throws ParseException 
	 */
	public ArrayList<MyFile> findFilesByKey(String path,String username,String regKey) throws ParseException {
		System.out.println("根据关键词"+regKey);
		ArrayList< MyFile>regList=new ArrayList<MyFile>();	
		File parentFolder=new File(path);		//要查询的父文件夹//保存返回的符合条件的文件列表
		Pattern pattern=Pattern.compile(regKey);
		Matcher matcher=null;
		String fileName=null;										//临时保存文件名
		File[]childrenFiles=parentFolder.listFiles();
		for (File file : childrenFiles) {
			fileName=file.getName();
			matcher=pattern.matcher(fileName);
		//	System.out.println(fileName+"\t"+matcher.find());
			if ((matcher.find()&&file.isDirectory())||regKey.equals("关键字查询")) {
				MyFile myFile=new MyFile();
				myFile.setFile(false);
				myFile.setFileSize("-");
				myFile.setFileType(Tools.FOLDERTYPE);
				myFile.setLastModitied(Tools.fileLastModifyTime(file.lastModified()));
				myFile.setName(fileName);
				System.out.println("parent:"+file.getParent());
				System.out.println("path:"+path);
				myFile.setPath(file.getParent().substring(path.length()));
				regList.add(myFile);
			}
			if (file.isDirectory()) {
				regList.addAll(findFolderByKey( file.getAbsolutePath(),username,regKey));
			}

		}
		ListFileService listFileService=new ListFileService();
		ArrayList<MyFile> filesList = listFileService.listUserFiles(username);
		
		for (int i=0;i<filesList.size();i++) {
			fileName=filesList.get(i).getName();
			matcher=pattern.matcher(fileName);
			Owner o;
			MyFile mf;
			int fid;
			MyFileDao myFileDao=new MyFileDao();
			ArrayList<Owner> lists=myFileDao.findUserFile(username);
			if ((matcher.find()||regKey.equals("关键字查询"))&&lists.get(i).getIsAlive()==0) {
				MyFile myFile = new MyFile();
				o=lists.get(i);
				fid=lists.get(i).getFileId();
				mf=myFileDao.findFileById(fid);
				myFile.setName(o.getOfileName());
				myFile.setFileType(mf.getFileType());
				myFile.setFileSize(Tools.dealFileSize(Long.parseLong(mf.getFileSize())));
				myFile.setLastModitied(o.getLastModify());
				myFile.setPath(o.getOuserPath());
				myFile.setFile(true);
				regList.add(myFile);
			}
		
		}
		return regList;
	}
	
	//老方法，已复写
//	public ArrayList<MyFile> findFileByKey(String path,String root,String regKey) throws ParseException {
//		System.out.println("根据关键词"+regKey+"查找路径"+path);
//		ArrayList< MyFile>regList=new ArrayList<MyFile>();				//保存返回的符合条件的文件列表
//		File parentFolder=new File(path);		//要查询的父文件夹
//		Pattern pattern=Pattern.compile(regKey);
//		Matcher matcher=null;
//		String fileName=null;										//临时保存文件名
//		File[]childrenFiles=parentFolder.listFiles();
//		for (File file : childrenFiles) {
//			fileName=file.getName();
//			matcher=pattern.matcher(fileName);
//		//	System.out.println(fileName+"\t"+matcher.find());
//			if (matcher.find()) {
//				MyFile myFile=new MyFile();
//				myFile.setFile(file.isFile());
//				myFile.setFileSize(Tools.dealFileSize(file.length()));
//				myFile.setFileType(Tools.getFileType(fileName));
//				myFile.setLastModitied(Tools.fileLastModifyTime(file.lastModified()));
//				myFile.setName(fileName);
//				System.out.println("parent:"+file.getParent());
//				System.out.println("path:"+path);
//				myFile.setPath(file.getParent().substring(root.length()));
//				regList.add(myFile);
//			}
//			if (file.isDirectory()) {
//				regList.addAll(findFileByKey( file.getAbsolutePath(),root,regKey));
//			}
//		}
//		return regList;
//	}
	
	/**
	 * 列出指定文件夹下所有子文件（不包括子文件夹）
	* 描述方法的功能
	* @param path
	* @return
	 */
	List<File>listAllChildFile(String path){
		ArrayList<File>arrayFiles=new ArrayList<File>();
		File folderFile=new File(path);
		File []list=folderFile.listFiles();
		for (File file : list) {
			if (file.isFile()) {
				arrayFiles.add(file);
			}else {
				arrayFiles.addAll(listAllChildFile(file.getAbsolutePath()));
			}
		}
		return arrayFiles;
	}
	/**
	 * 列出指定文件夹下所有子文件（包括子文件夹）
	* 描述方法的功能
	* @param path
	* @return
	 */
	List<File>listRecycalChildFile(String path){
		ArrayList<File>arrayFiles=new ArrayList<File>();
		File folderFile=new File(path);
		File []list=folderFile.listFiles();
		System.out.println("---------->"+list.length);
		for (File file : list) {
				arrayFiles.add(file);
		}
		return arrayFiles;
	}
	
	
	/**
	 * 
	* 根据扩展名字符串数组获取扩展名列表
	* @param extStrings
	* @return
	 */
	ArrayList<String>getExtList(String []extStrings){
		ArrayList<String>extArrayList=new ArrayList<String>();
		for (int i = 0; i < extStrings.length; i++) {
			extArrayList.add(extStrings[i]);
		}
		return extArrayList;
	}
	
	public static void main(String[] args) throws ParseException {
		List<MyFile>files=new FileFilterService().getFilterList( "D:\\毕业设计\\disk","music" );
		System.out.println(files.size());
		for (MyFile myFile : files) {
			System.out.println(myFile.getName()+"\t"+myFile.getFileSize());
		}
	}

}
